- add sources.
[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 "crypto/crypto_module_blocking_password_delegate.h"
13 #include "grit/generated_resources.h"
14 #include "ui/base/gtk/gtk_hig_constants.h"
15 #include "ui/base/gtk/gtk_signal.h"
16 #include "ui/base/l10n/l10n_util.h"
17 #include "url/gurl.h"
18
19 namespace {
20
21 // TODO(mattm): change into a constrained dialog.
22 class CryptoModulePasswordDialog {
23  public:
24   CryptoModulePasswordDialog(
25       const std::string& slot_name,
26       bool retry,
27       chrome::CryptoModulePasswordReason reason,
28       const std::string& server,
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& server,
52     const chrome::CryptoModulePasswordCallback& callback)
53     : callback_(callback) {
54   dialog_ = gtk_dialog_new_with_buttons(
55       l10n_util::GetStringUTF8(IDS_CRYPTO_MODULE_AUTH_DIALOG_TITLE).c_str(),
56       NULL,
57       GTK_DIALOG_NO_SEPARATOR,
58       NULL);  // Populate the buttons later, for control over the OK button.
59   gtk_dialog_add_button(GTK_DIALOG(dialog_),
60                         GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
61   GtkWidget* ok_button = gtk_util::AddButtonToDialog(
62       dialog_,
63       l10n_util::GetStringUTF8(
64           IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL).c_str(),
65       GTK_STOCK_OK,
66       GTK_RESPONSE_ACCEPT);
67   gtk_widget_set_can_default(ok_button, TRUE);
68   gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT);
69
70   // Select an appropriate text for the reason.
71   std::string text;
72   const string16& server16 = UTF8ToUTF16(server);
73   const string16& slot16 = UTF8ToUTF16(slot_name);
74   switch (reason) {
75     case chrome::kCryptoModulePasswordKeygen:
76       text = l10n_util::GetStringFUTF8(
77           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_KEYGEN, slot16, server16);
78       break;
79     case chrome::kCryptoModulePasswordCertEnrollment:
80       text = l10n_util::GetStringFUTF8(
81           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_ENROLLMENT, slot16, server16);
82       break;
83     case chrome::kCryptoModulePasswordClientAuth:
84       text = l10n_util::GetStringFUTF8(
85           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CLIENT_AUTH, slot16, server16);
86       break;
87     case chrome::kCryptoModulePasswordListCerts:
88       text = l10n_util::GetStringFUTF8(
89           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_LIST_CERTS, slot16);
90       break;
91     case chrome::kCryptoModulePasswordCertImport:
92       text = l10n_util::GetStringFUTF8(
93           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_IMPORT, slot16);
94       break;
95     case chrome::kCryptoModulePasswordCertExport:
96       text = l10n_util::GetStringFUTF8(
97           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_EXPORT, slot16);
98       break;
99     default:
100       NOTREACHED();
101   }
102   GtkWidget* label = gtk_label_new(text.c_str());
103   gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
104   gtk_util::LeftAlignMisc(label);
105   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), label,
106                      FALSE, FALSE, 0);
107
108   password_entry_ = gtk_entry_new();
109   gtk_entry_set_activates_default(GTK_ENTRY(password_entry_), TRUE);
110   gtk_entry_set_visibility(GTK_ENTRY(password_entry_), FALSE);
111
112   GtkWidget* password_box = gtk_hbox_new(FALSE, ui::kLabelSpacing);
113   gtk_box_pack_start(GTK_BOX(password_box),
114                      gtk_label_new(l10n_util::GetStringUTF8(
115                          IDS_CRYPTO_MODULE_AUTH_DIALOG_PASSWORD_FIELD).c_str()),
116                      FALSE, FALSE, 0);
117   gtk_box_pack_start(GTK_BOX(password_box), password_entry_,
118                      TRUE, TRUE, 0);
119
120   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), password_box,
121                      FALSE, FALSE, 0);
122
123   g_signal_connect(dialog_, "response",
124                    G_CALLBACK(OnResponseThunk), this);
125   g_signal_connect(dialog_, "destroy",
126                    G_CALLBACK(OnWindowDestroyThunk), this);
127 }
128
129 void CryptoModulePasswordDialog::Show() {
130   gtk_util::ShowDialog(dialog_);
131 }
132
133 void CryptoModulePasswordDialog::OnResponse(GtkWidget* dialog,
134                                             int response_id) {
135   if (response_id == GTK_RESPONSE_ACCEPT)
136     callback_.Run(gtk_entry_get_text(GTK_ENTRY(password_entry_)));
137   else
138     callback_.Run(static_cast<const char*>(NULL));
139
140   // This will cause gtk to zero out the buffer.  (see
141   // gtk_entry_buffer_normal_delete_text:
142   // http://git.gnome.org/browse/gtk+/tree/gtk/gtkentrybuffer.c#n187)
143   gtk_editable_delete_text(GTK_EDITABLE(password_entry_), 0, -1);
144   gtk_widget_destroy(dialog_);
145 }
146
147 void CryptoModulePasswordDialog::OnWindowDestroy(GtkWidget* widget) {
148   delete this;
149 }
150
151 }  // namespace
152
153 namespace chrome {
154
155 void ShowCryptoModulePasswordDialog(
156     const std::string& slot_name,
157     bool retry,
158     CryptoModulePasswordReason reason,
159     const std::string& server,
160     const CryptoModulePasswordCallback& callback) {
161   (new CryptoModulePasswordDialog(slot_name, retry, reason, server,
162                                   callback))->Show();
163 }
164
165 }  // namespace chrome